package cn.doitedu.javase.thread_pool;

import java.util.concurrent.*;

public class _01_CallableVsRunnable {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        // 线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        // 提交的是runnable任务，而runnable任务的run方法没有任何返回值，
        // 所以这个线程池帮我们执行完任务后，也没有什么实质性的返回值
        Future<?> submit = executorService.submit(new RunnableTask());

        // submit方法，会立即返回结果，但是这个结果是一个future；future代表未来的结果
        Future<Integer> future = executorService.submit(new CallableTask());
        boolean done = future.isDone();
        System.out.println(done);

        // future有一个方法去获取结果,此方法是阻塞的；
        // 它会等待，直到callable任务的call方法执行完成，才会取到结果
        Integer callTaskResult = future.get();
        System.out.println(callTaskResult);

    }

}

class RunnableTask implements Runnable {
    @Override
    public void run() {
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += i;
        }
        System.out.println("求和结果: " + sum);
    }
}


class CallableTask implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {

        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += i;
        }

        Thread.sleep(5000);

        return sum;
    }
}
